/* eslint-disable @typescript-eslint/no-explicit-any */
/*
 *  Copyright 2021 Collate
 *  Licensed under the Apache License, Version 2.0 (the "License");
 *  you may not use this file except in compliance with the License.
 *  You may obtain a copy of the License at
 *  http://www.apache.org/licenses/LICENSE-2.0
 *  Unless required by applicable law or agreed to in writing, software
 *  distributed under the License is distributed on an "AS IS" BASIS,
 *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 *  See the License for the specific language governing permissions and
 *  limitations under the License.
 */

 /**
 * 报告数据
 */
export interface ReportData {
    /**
     * 捕获的数据
     */
    data?: DataClass;
    /**
     * 结果的唯一标识符
     */
    id?: string;
    /**
     * 数据类型
     */
    reportDataType?: ReportDataType;
    /**
     * 结果摄取的时间戳
     */
    timestamp: number;
    [property: string]: any;
}

/**
 * 捕获的数据
 *
 * 用于实体报告的精炼数据
 *
 * 概览报告的精炼数据
 *
 * 成本分析报告的原始数据
 *
 * 成本分析报告的聚合数据。
 */
export interface DataClass {
    /**
     * 实体的已完成描述数量
     */
    completedDescriptions?: number;
    /**
     * 实体数量
     */
    entityCount?: number;
    /**
     * 实体的分级
     *
     * 实体分级
     */
    entityTier?: string;
    /**
     * 实体的类型
     *
     * 实体类型
     */
    entityType?: string;
    /**
     * 具有所有者的实体数量
     */
    hasOwner?: number;
    /**
     * 实体的缺失描述数量
     */
    missingDescriptions?: number;
    /**
     * 缺少所有者的实体数量
     */
    missingOwner?: number;
    /**
     * 与实体关联的组织（即所有者）
     */
    organization?: string;
    /**
     * 服务的名称
     *
     * 服务名称
     */
    serviceName?: string;
    /**
     * 与实体关联的团队（即所有者）
     *
     * 用户所属的团队
     */
    team?: string;
    /**
     * 最新会话
     */
    lastSession?: number;
    /**
     * 总用户计数
     */
    totalPageView?: number;
    /**
     * 总用户计数
     */
    totalSessionDuration?: number;
    /**
     * 总会话数
     */
    totalSessions?: number;
    /**
     * 平台中的用户ID
     */
    userId?: string;
    /**
     * 用户名称
     */
    userName?: string;
    /**
     * 实体的完全限定名称
     */
    entityFqn?: string;
    /**
     * 实体链接
     */
    entityHref?: string;
    /**
     * 实体所有者的名称
     */
    owner?: string;
    /**
     * 实体所有者的名称
     */
    ownerId?: string;
    /**
     * 标签的完全限定名称
     */
    tagsFQN?: string[];
    /**
     * 实体被查看的次数
     */
    views?: number;
    /**
     * 生命周期数据的实体
     */
    entity?: EntityReference;
    /**
     * 与实体相关的生命周期数据
     */
    lifeCycle?: LifeCycle;
    /**
     * 以字节为单位的实体大小
     */
    sizeInByte?: number;
    /**
     * 一段时间内频繁使用的数据资产的计数和大小
     */
    frequentlyUsedDataAssets?: DataAssetMetrics;
    /**
     * 服务所有者的名称
     */
    serviceOwner?: string;
    /**
     * 服务类型
     */
    serviceType?: string;
    /**
     * 总计数
     */
    totalCount?: number;
    /**
     * 基于字节的总大小
     */
    totalSize?: number;
    /**
     * 一段时间内未使用的数据资产的计数和大小
     */
    unusedDataAssets?: DataAssetMetrics;
}

/**
 * 生命周期数据的实体
 *
 * This schema defines the EntityReference type used for referencing an entity.
 * EntityReference is used for capturing relationships from one entity to another. For
 * example, a table has an attribute called database of type EntityReference that captures
 * the relationship of a table `belongs to a` database.
 *
 * 创建、更新或访问数据资产的用户、流水线或查询
 */
export interface EntityReference {
    /**
     * If true the entity referred to has been soft-deleted.
     */
    deleted?: boolean;
    /**
     * Optional description of entity.
     */
    description?: string;
    /**
     * Display Name that identifies this entity.
     */
    displayName?: string;
    /**
     * Fully qualified name of the entity instance. For entities such as tables, databases
     * fullyQualifiedName is returned in this field. For entities that don't have name hierarchy
     * such as `user` and `team` this will be same as the `name` field.
     */
    fullyQualifiedName?: string;
    /**
     * Link to the entity resource.
     */
    href?: string;
    /**
     * Unique identifier that identifies an entity instance.
     */
    id: string;
    /**
     * If true the relationship indicated by this entity reference is inherited from the parent
     * entity.
     */
    inherited?: boolean;
    /**
     * Name of the entity instance.
     */
    name?: string;
    /**
     * Entity type/class name - Examples: `database`, `table`, `metrics`, `databaseService`,
     * `dashboardService`...
     */
    type: string;
}

/**
 * 一段时间内频繁使用的数据资产的计数和大小
 *
 * 存储一段时间内数据资产的计数和字节大小
 *
 * 一段时间内未使用的数据资产的计数和大小
 */
export interface DataAssetMetrics {
    /**
     * 一段时间内的数据资产计数
     */
    count?: DataAssetValues;
    /**
     * 一段时间内的数据资产大小
     */
    size?: DataAssetValues;
    /**
     * 总计数
     */
    totalCount?: number;
    /**
     * 基于字节的总大小
     */
    totalSize?: number;
    [property: string]: any;
}

/**
 * 一段时间内的数据资产计数
 *
 * 数据资产在一段时间内的计数或字节大小
 *
 * 一段时间内的数据资产大小
 */
export interface DataAssetValues {
    /**
     * 14天内的数据资产计数或大小
     */
    fourteenDays?: number | null;
    /**
     * 7天内的数据资产计数或大小
     */
    sevenDays?: number | null;
    /**
     * 60天内的数据资产计数或大小
     */
    sixtyDays?: number | null;
    /**
     * 30天内的数据资产计数或大小
     */
    thirtyDays?: number | null;
    /**
     * 3天内的数据资产计数或大小
     */
    threeDays?: number | null;
}

/**
 * 与实体相关的生命周期数据
 *
 * 此模式定义生命周期属性
 */
export interface LifeCycle {
    /**
     * 关于数据资产访问方面的访问详细信息
     */
    accessed?: AccessDetails;
    /**
     * 关于数据资产创建方面的访问详细信息
     */
    created?: AccessDetails;
    /**
     * 关于数据资产更新方面的访问详细信息
     */
    updated?: AccessDetails;
}

/**
 * 关于数据资产访问方面的访问详细信息
 *
 * 实体的访问详细信息
 *
 * 关于数据资产创建方面的访问详细信息
 *
 * 关于数据资产更新方面的访问详细信息
 */
export interface AccessDetails {
    /**
     * 创建、更新或访问数据资产的用户、流水线或查询
     */
    accessedBy?: EntityReference;
    /**
     * 访问数据资产的任何未在 OpenMetadata 中捕获的过程
     */
    accessedByAProcess?: string;
    /**
     * 数据资产创建、更新或读取的时间戳
     */
    timestamp: number;
}

/**
 * 数据类型
 */
export enum ReportDataType {
    AggregatedCostAnalysisReportData = "aggregatedCostAnalysisReportData",
    EntityReportData = "entityReportData",
    RawCostAnalysisReportData = "rawCostAnalysisReportData",
    WebAnalyticEntityViewReportData = "webAnalyticEntityViewReportData",
    WebAnalyticUserActivityReportData = "webAnalyticUserActivityReportData",
}
